package com.example.tally.frag_chart;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;

import androidx.fragment.app.Fragment;

import com.example.tally.DataBase.ChartItemBean;
import com.example.tally.DataBase.DBManager;
import com.example.tally.R;
import com.example.tally.adapter.ChartItemAdapter;
import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;

import java.util.ArrayList;
import java.util.List;

abstract public class BaseChartFragment extends Fragment {
    ListView chartLv;
    public int year;
    public int month;
    List<ChartItemBean> mDatas;   //数据源
    private ChartItemAdapter itemAdapter;
    BarChart barChart;    //表示柱状图的控件
    TextView chartTv;   //表示如果没有收支情况，所显示的文本控件

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_in_chart, container, false);
        chartLv = view.findViewById(R.id.frag_chart_lv);
        //获取Activity传递过来的数据
        Bundle bundle = getArguments();
        year = bundle.getInt("year");
        month = bundle.getInt("month");

        //设置数据源
        mDatas = new ArrayList<>();

        //设置适配器
        itemAdapter = new ChartItemAdapter(getContext(), mDatas);
        chartLv.setAdapter(itemAdapter);

        //添加头布局
        addLvHeaderView();

        return view;
    }

    protected void addLvHeaderView(){
        //将布局转换成View对象
        View headerView = getLayoutInflater().inflate(R.layout.item_chart_frag_top,null);

        //将View添加到List View的头布局上
        chartLv.addHeaderView(headerView);

        //查找头布局当中包含的控件
        barChart = headerView.findViewById(R.id.item_chart_frag_chart);
        chartTv = headerView.findViewById(R.id.item_chart_frag_top_tv);

        //设定柱状图不显示时的文本描述    即：暂无数据
        barChart.getDescription().setEnabled(false);

        //设置柱状图
        barChart.setExtraOffsets(20, 20, 20, 20);  //设置饼图的偏移量，类似于内边距 ，设置视图窗口大小
        setAxis(year,month);   // 设置坐标轴

        //设置坐标轴显示的数据

        barChart.setScaleXEnabled(false);                  //禁止x轴缩放
        barChart.setScaleYEnabled(false);                 //禁止y轴缩放
        setAxisData(year,month);
    }

//    设置坐标轴显示的数据,在子类中完善
    protected abstract void setAxisData(int year, int month);

//    设置柱状图坐标轴的显示   方法必须重写
    protected void setAxis(int year,int month){
        //设置X轴
        XAxis xAxis = barChart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);   //设置X轴显示在下方
        xAxis.setDrawGridLines(true);   //设置绘制该轴的网格线

        //设置X轴标签的个数
        xAxis.setLabelCount(31);
        xAxis.setTextSize(12f);   //X轴标签的大小

        //设置x轴显示的值的格式
        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                int val = (int) value;
                if (val == 0) {
                    return month + "-1";
                }

                if (val == 14) {
                    return month + "-15";
                }

                //根据不同的月份，显示最后一天的位置
                if (month == 2) {
                    if (val == 27) {
                        return month + "-28";
                    }
                } else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
                    if (val == 30) {
                        return month + "-31";
                    }
                } else if (month == 4 || month == 6 || month == 9 || month == 11) {
                    if (val == 31) {
                        return month + "-30";
                    }
                }
                return "";
            }
        });
        xAxis.setYOffset(15);   //设置标签对x轴的偏移量，垂直方向

        //设置Y轴   在子类设置
        setYAxis(year, month);
    }

//    Y轴在子类的设置   因为Y轴的最大金额根据每月的收支情况改变，即最高坐标不确定
    protected abstract void setYAxis(int year, int month);

    public void setDate(int year,int month){
        this.year = year;
        this.month = month;
        //清空柱状图当中的数据
        barChart.clear();
        barChart.invalidate();   //重新绘制柱状图
        setAxis(year,month);
        setAxisData(year,month);
    }

    public void loadData(int year,int month,int kind) {
        List<ChartItemBean> list = DBManager.getChartListFromAccountTb(year, month, kind);
        mDatas.clear();
        mDatas.addAll(list);
        itemAdapter.notifyDataSetChanged();
    }
}